// utils/retry.ts
// 带重试机制的请求工具

/**
 * 带重试机制的异步请求函数
 * @param requestFn 请求函数
 * @param maxRetries 最大重试次数，默认3次
 * @param baseDelay 基础延迟时间（毫秒），默认1000ms
 * @returns 请求结果
 */
export async function requestWithRetry<T>(
  requestFn: () => Promise<T>,
  maxRetries: number = 3,
  baseDelay: number = 1000
): Promise<T> {
  let lastError: any;

  for (let i = 0; i <= maxRetries; i++) {
    try {
      return await requestFn();
    } catch (error) {
      lastError = error;
      
      // 如果是最后一次重试，抛出错误
      if (i === maxRetries) {
        throw lastError;
      }
      
      // 指数退避延迟
      const delay = Math.pow(2, i) * baseDelay;
      console.warn(`请求失败，${delay}ms后进行第${i + 1}次重试...`, error);
      
      await new Promise(resolve => setTimeout(resolve, delay));
    }
  }
  
  throw lastError;
}

/**
 * 判断是否应该重试的错误
 * @param error 错误对象
 * @returns 是否应该重试
 */
export function shouldRetry(error: any): boolean {
  // 网络错误应该重试
  if (error.code === 'NETWORK_ERROR') {
    return true;
  }
  
  // 5xx服务器错误应该重试
  if (error.response && error.response.status >= 500 && error.response.status < 600) {
    return true;
  }
  
  // 特定的4xx错误可以重试（如请求超时）
  if (error.response && error.response.status === 408) {
    return true;
  }
  
  return false;
}